#ifndef __LRUCACHE_HPP__
#define __LRUCACHE_HPP__

#include <string>
#include <unordered_map>
#include <list>
#include <utility>

using std::list;
using std::pair;
using std::string;
using std::unordered_map;

class CacheManager;

/* extern __thread size_t __thread_id; */

class LRUCache {
    
    friend class CacheManager;
    using Record = pair<string, string>;
    using iterator = list<pair<string, string>>::iterator;

public:
    //构造函数，传入LRU的大小
    LRUCache(size_t);
    //查LRU是否命中
    bool isHit(const string &);
    //获取记录
    string getRecord(const string &);
    //插入记录
    void insertRecord(const string &, const string &);
    //从磁盘读取缓存文件
    void load(const string &);
    //将缓存信息写入磁盘
    void store(const string &);
    //更新缓存信息
    void update(const LRUCache &);
    //清空缓存
    void clear();
    //获取缓存大小
    size_t size() const;
private:
    //每个Cache块的记录
    list<Record> _resultList;
    //哈希表，根据key快速找到在list中的位置
    unordered_map<string, iterator> _hashMap;
    //Cache块的容量
    size_t _capacity;
};

#endif
